#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;
/*
题目描述：

题目分析：
三种状态：采药时间 采药的价值 允许采药的次数c
状态转移方程
f(i,t,c) = max(f(i-1,t,cnt[i-1]),f(i,t-c[i],c-1)+v[i])  要么不采草药，要么采草药一次，

边界情况
i<=0

*/

const int maxn = 105;

int cost[maxn];
int value[maxn];
int cnt[maxn];
int vis[maxn][maxn][maxn];
int T,n;

int f(int i, int t, int c)
{
    if(vis[i][t][c])
        return vis[i][t][c];
    if(i==0) //前0种药
        return 0;
    if(t-cost[i]<0 || c<=0) //时间不够
        return vis[i][t][c] = f(i-1,t,cnt[i-1]);
    return vis[i][t][c] = max(
        f(i,t-cost[i],c-1)+value[i],
        f(i-1,t,cnt[i-1])
    );
    
}

int main()
{
    memset(vis,0,sizeof(vis));
    cin>>n>>T;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",cost+i);
        scanf("%d",value+i);
        scanf("%d",cnt+i);  //每种草药允许采摘的数量

    }
    printf("%d", f(n,T,cnt[n]));

    return 0;
}